﻿#pragma once
#include "../src_dataProcessor/basicData.h"
#include "../src_config/configUI.h"
#include "src_basics/utils.h"						//算法中用到的基础函数，数据结构
#include "../src_algorithms/src_slide/slide.h"		//推挤算法
#include "../src_algorithms/src_polygon/PolygonAlg.h"

//algorithm类: 用于过渡前端与后端数据交互

class Algorithoms {
public:
	Algorithoms() : m_data(nullptr), m_config(nullptr) {}
	Algorithoms(BasicData* data, ConfigUI* config) : m_data(data), m_config(config) {}
	~Algorithoms() {}
	void setData(BasicData* data) { m_data = data; }

	//算法部分
public:
	//1.推挤算法
	// 1.1 推线
	bool pushLineRun(const QPointF& offset, const bool inGreed, const bool postOn);
	void pushLineRunBegin(LineUI& line, vector<LineUI>& lines);		//设置算法数据，算法执行的起点
	void pushLineRunOver(const QPointF& offset);					//算法执行结束，更新数据

	// 1.2 推点
	bool pushPinRun(const QPointF& offset, bool inGreed = false);
	void pushPinRunBegin(QPointF pt, vector<LineUI>& lines);			//设置算法数据，算法执行的起点
	void pushPinRunOver(const QPointF& offset);						//算法执行结束，更新数据

	//2. PPDT算法
	void PPDTRun(bool runInit = true, bool runPahtFinding = true);
	void PPDTRunBegin();		//设置算法数据，算法执行的起点
	void PPDTRunOver();					//算法执行结束，更新数据

	//3.polygen算法
	void polyRun();
	void polyRunBegin();
	void polyRunOver();


private:
	//0.实时更新的基础数据，其存在于m_data中，前端会实时显示该数据
	BasicData* m_data;
	ConfigUI* m_config;	//配置信息
	vector<LineUI>* m_basicData = nullptr;

	//1.推挤算法
	//1.1推线
	LineUI m_selectLine;
	vector<Line> m_beginLines;					//算法的初始输入数据，每次算法运行，都以此数据为基础
	bool setPushLineData(vector<Line>& polyLines_input, Line& line_input, Point& offset_input, const QPointF& offset_ui);
	void pushLineDataUpdate(vector<Line>& polyLines_input);			//算法执行结束，更新数据
	//1.2推点
	QPointF m_selectPt;
	bool setPushPinData(vector<Line>& polyLines_input, Point& pt_input, Point& offset_input, const QPointF& offset_ui);

	//2.PPDT算法

	//3.polygen算法
	vector<Point> m_points;
	vector<vector<Line>> m_polyLines;
	vector<vector<vector<Line>>> m_polygonss;

};